package net.interneteidee.servizi;

import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.Lifecycle;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.xml.bind.JAXBElement;

import org.apache.log4j.lf5.viewer.configure.MRUFileManager;
import org.eclipse.jdt.internal.compiler.ast.Clinit;

import net.interneteidee.dao.ClienteDao;
import net.interneteidee.dao.RegioneDao;
import net.interneteidee.entity.Cliente;
import net.interneteidee.entity.Regione;


@Path("/clienti")
@Produces( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON , MediaType.TEXT_XML})
@Consumes( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON , MediaType.TEXT_XML })
@Stateless
public class ClienteService {

	@Inject
	ClienteDao clienteDao;
	
	@Inject
	RegioneDao regioneDao;
	
	public ClienteService() {
		// TODO Auto-generated constructor stub
	}
	
	public void addClient(Cliente cliente){
		if(cliente.getIdCliente()==0)
			clienteDao.save(cliente);
		else
			clienteDao.update(cliente);
	}
	
	public void removeClient(Cliente clienteDaRimuovere){
		clienteDaRimuovere.setAbilitato(false);
		clienteDao.update(clienteDaRimuovere);
		//clienteDao.remove(clienteDaRimuovere);
	}
	
	public void updateClient(Cliente cliente){
		clienteDao.update(cliente);
	}
	
	public List<Cliente> findAllClients(){
		return clienteDao.findAll();
	}
	
	
	
	/** 
	 * @return restituisce tutti i clienti attivi cioè i clienti che hanno 
	 * fatto almeno un ordine nell' anno
	 */
	public List<Cliente> findClientiAttivi(){
		
		return clienteDao.findClientiAttivi();
	}
	
	public Cliente findClienteById(long idCliente){
		return clienteDao.findById(idCliente);
	}
	
	public Regione findRegioneById(long idRegione){
		return regioneDao.findById(idRegione);
	}
	
	public List<Regione> findAllRegione(){
		return regioneDao.findAll();
	}
	
	/**
	 * Permette di ottenere l' importo che un cliente deve dare all' azienda
	 * questo viene calcolato dalla sottrazione del totale degli ordini evasi - il totale delle fatture pagate
	 * per un dato cliente
	 * @param idCliente
	 * @return
	 */
	public double getImportoDaRecuperare(int idCliente){return 0.0;}
	
	
	/**
	 * peremtte di ottenere il tempo medio di pagamento 
	 * @param idCliente
	 * @return
	 */
	public int getTempoMedioDiPagamento(int idCliente){return 0;}
	
	
	//-------Metodi esporti al pubblico attraverso i webservices--------
	
	@GET
	@Path("clientiattivi")
	public List<Cliente> findClientiAttiviWS(@Context SecurityContext securityContext ){

		List<Cliente> clientiAttivi = clienteDao.findClientiAttivi();

		if(!securityContext.isUserInRole("Admin"))
			throw new WebApplicationException(Response.Status.FORBIDDEN);
			
		if(clientiAttivi.size()==0)
			throw new WebApplicationException(Response.Status.NOT_FOUND);
	
		
		return clientiAttivi;
		
	}
	
	@POST
	@Path("creanuovocliente")
	public void createNewClient(JAXBElement<Cliente> clienteJaxB,@Context Request request){

		Cliente cliente = clienteJaxB.getValue();
		clienteDao.save(cliente);
	}
}
